package com.cskaoyan.javase.network._1udp._0introduction;
/**
 * UDP是一种面向无连接的协议，因此在通信时发送端和接收端不用建立连接。数据是以数据包的形式传输的。
 * 我们把UDP网络编程理解成货运公司在两个码头间发送、接收货物一样
 * 在传输的过程中首先需要创建两个“码头”，其次还需要用集装箱把货物装起来然后在进行传输。
 * 上面句子的含义就是：
 *      1.需要创建接收端和发送端两个Socket（码头）
 *      2.需要将数据封装成数据包再进行传输（集装箱）
 *
 * 所谓的码头的实现依赖于:
 * java.net.DatagramSocket(套接字),然后数据发送方和接收方都需要创建这个套接字对象,相当于有了两个码头
 *
 * 所谓的集装箱(数据报包)的实现依赖于:
 * java.net.DatagramPacket
 * 发送方需要将要发送的数据,封装成DatagramPacket对象然后进行发送
 * 接收方同样接收到了这个DatagramPacket对象,然后需要进行拆包,解析数据处理
 *
 * UDP编程在传输通信数据的过程中,是以字节的形式传输数据的,需要使用byte[]
 *
 * 在创建发送端和接收端的DatagramPacket对象时，使用的构造方法有所不同：
 *      1.接收端的构造方法只需要接收一个字节数组来存放接收到的数据。(UDP接受方数据包只用来接收数据)
 *          这就意味着接收端的码头(DatagramSocket)必须指明从哪里接收数据,指明IP地址和端口号
 *
 *      2.发送端的构造方法不但要接收存放了发送数据的字节数组，还需要指定发送端IP地址和端口号。
 *      (UDP发送端的数据包,不仅要给出发送的数据byte数组,还需要指定发送的目的IP地址和端口号)
 *          这就意味着发送端的码头(DatagramSocket)就不需要指明数据往哪里发,因为数据包里已经说了这个事情
 * 接收端的数据报包构造器:
 * // 构造 DatagramPacket，用来接收长度为length的包，在缓冲区中指定了偏移量。
 * DatagramPacket(byte[] buf, int offset, int length)
 * // 构造 DatagramPacket，用来接收长度为length的数据包。
 * DatagramPacket(byte[] buf, int length)
 *
 * 发送端的数据报包构造器:
 * // 构造数据报包，用来将长度为length偏移量为offset的包发送到指定主机上的指定端口号。
 * DatagramPacket(byte[] buf,  int offset, int length, InetAddress address, int port)
 * // 构造数据报包，用来将长度为length的包发送到指定主机上的指定端口号。
 * DatagramPacket(byte[] buf, int length, InetAddress address, int port)
 *
 * IP地址的表示:
 * // 获取一个表示本地主机的InetAddress对象
 * InetAddress address = InetAddress.getLocalHost();
 * // 获取一个指定ip地址的InetAddress对象
 * InetAddress address2 = InetAddress.getByName("ip地址");
 *
 *
 * 表示码头的DatagramSocket类有三个常用的构造器,表示创建发送端或者接收端的"码头"套接字:
 * // ip:本机IP 端口：随机分配一个可用端口
 * DatagramSocket()
 * // ip:主机IP 端口：参数指定
 * DatagramSocket(int port)
 * // 指定IP和端口
 * DatagramSocket(int port,InetAddress laddr)
 *
 * 发送端的构造器: 由于发送端的数据报包已经明确指出了发给谁,所以创建套接字对象时,无需明确指出
 *      所以三个构造器都可以创建发送端的套接字对象
 *      发送端的套接字对象就可以使用send方法,发送数据报包
 *
 * 接收端的构造器: 由于接收端的数据报包只管接收数据,不关心数据来源
 *      于是接收端的套接字必须明确指出从何处受到数据,必须明确ip地址和端口号
 *      // ip:主机IP 端口：参数指定
 *      DatagramSocket(int port)
 *      // 指定IP和端口
 *      DatagramSocket(int port,InetAddress laddr)
 * 接收端只能用以上两个构造器创建套接字对象
 *      接收端的套接字对象就可以使用receive方法,接收数据报包
 *
 * @since 10:04
 * @author wuguidong@cskaoyan.onaliyun.com
 */
public class Demo {
}
